const { Node, SingleList } = require("./SingleList");
class CirSingleList extends SingleList {
  constructor() {
    super();
  }
  // 在单向循环链表中寻找最后一个节点
  findLast() {
    let currNode = this.head;
    let count = 0;
    // 判断定义的变量，如果等于链表的size，说明是最后一个节点
    while (count++ !== this.size) {
      currNode = currNode.next;
    }
    return currNode;
  }

  // 在单向循环链表中寻找数据
  find(item) {
    let currNode = this.head;
    let lastNode = this.findLast();
    while (currNode.element !== item) {
      // 判断查找的节点是不是最后一个节点，如果是最后一个节点，则停止循环。
      // 不添加这层判断会进入无限循环
      if (currNode === lastNode) {
        currNode = null;
        return;
      }
      currNode = currNode.next;
    }
    return currNode;
  }

  // 在数据为item的节点后面插入数据为element元素的节点
  insert(item, element) {
    let itemNode = this.find(item);
    let newNode = new Node(element);

    if (!itemNode) {
      // 如果item在单循环链表中不存在
      return;
    }

    // 插入的位置处于头结点之后，第一个节点之前
    if (item === "head") {
      if (this.size === 0) {
        // 当单循环链表为空时
        this.head.next = newNode;
        newNode.next = this.head.next;
      } else {
        // 当单循环链表不空时
        let lastNode = this.findLast();
        newNode.next = this.head.next;
        this.head.next = newNode;
        lastNode.next = newNode;
      }

      this.size++;
      return;
    }

    // 处于链表中间位置时
    newNode.next = itemNode.next;
    itemNode.next = newNode;

    this.size++;
  }

  remove(item) {
    let curNode = this.find(item); // 找到待删除节点
    let lastNode = this.findLast(); // 找到最后一个节点
    let preCurNode = this.head;

    // 找到待删除节点的前一个节点
    while (preCurNode.next !== curNode) {
      preCurNode = preCurNode.next;
    }

    if (curNode == this.head.next) {
      // 如果当前节点是第一个节点
      //头节点的后一个节点
      if (this.size == 1) {
        //只剩最后一个节点
        this.head.next = null;
      } else {
        //还有其他节点
        this.head.next = curNode.next;
        lastNode.next = curNode.next;
      }
    } else {
      // 其他情况
      preCurNode.next = curNode.next;
    }

    this.size--;
  }

  display() {
    let description = "head";
    let currNode = this.head;
    let lastNode = this.findLast();
    // 判断节点是否到了尾节点
    while (currNode !== lastNode) {
      currNode = currNode.next;
      description += `->${currNode.element}`;
    }

    console.log(description);
  }

  //在尾部添加数据
  append(element) {
    let lastNode = this.findLast();
    let newNode = new Node(element);

    lastNode.next = newNode;
    newNode.next = this.head.next;

    this.size++;
  }
}

module.exports = { CirSingleList };
